home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / matrx042.zip / MATINV.C < prev    next >
Text File  |  1992-05-24  |  2KB  |  77 lines

  1. /*
  2. *-----------------------------------------------------------------------------
  3. *    file:    matinv.c
  4. *    desc:    matrix inversion
  5. *    by:    ko shu pui, patrick
  6. *    date:    24 nov 91 v0.1
  7. *    revi:    14 may 92 v0.2
  8. *    ref:
  9. *       [1] Mary L.Boas, "Mathematical Methods in the Physical Sciene,"
  10. *    John Wiley & Sons, 2nd Ed., 1983. Chap 3.
  11. *
  12. *    [2] Kendall E.Atkinson, "An Introduction to Numberical Analysis,"
  13. *    John Wiley & Sons, 1978.
  14. *
  15. *-----------------------------------------------------------------------------
  16. */
  17. #include <stdio.h>
  18. #include <math.h>
  19.  
  20. #ifdef    __TURBOC__
  21. #include <alloc.h>
  22. #else
  23. #include <malloc.h>
  24. #endif
  25.  
  26. #include "matrix.h"
  27.  
  28.  
  29. /*
  30. *-----------------------------------------------------------------------------
  31. *    funct:    mat_inv
  32. *    desct:    find inverse of a matrix
  33. *    given:    a = square matrix a
  34. *    retrn:    square matrix Inverse(A)
  35. *        NULL = fails, singular matrix, or malloc() fails
  36. *-----------------------------------------------------------------------------
  37. */
  38. MATRIX mat_inv( a )
  39. MATRIX a;
  40. {
  41.     MATRIX    A, B, C, P;
  42.     int    i, j, n;
  43.     double    temp;
  44.  
  45.     n = MatCol(a);
  46.     A = mat_copy(a);
  47.     B = mat_creat( n, 1, UNDEFINED );
  48.     C = mat_creat( n, n, UNDEFINED );
  49.     P = mat_creat( n, 1, UNDEFINED );
  50.  
  51.     /*
  52.     *    - LU-decomposition -
  53.     *    also check for singular matrix
  54.     */
  55.     if (mat_lu(A, P) == -1)
  56.         {
  57.         mat_free(A);
  58.         mat_free(B);
  59.         mat_free(C);
  60.         mat_free(P);
  61.  
  62.         return (NULL);
  63.         }
  64.  
  65.     for (i=0; i<n; i++)
  66.         {
  67.         mat_fill(B, ZERO_MATRIX);
  68.         B[i][0] = 1.0;
  69.         mat_backsubs1( A, B, C, P, i );
  70.         }
  71.  
  72.     mat_free(A);
  73.     mat_free(B);
  74.     mat_free(P);
  75.     return (C);
  76. }
  77.